if ( missed_ticks <= 0 )
return;
- if ( mode_is(pt->vcpu->domain, no_missed_tick_accounting) )
- {
- pt->pending_intr_nr = 1;
- pt->scheduled = now + pt->period;
- }
- else
- {
- missed_ticks = missed_ticks / (s_time_t) pt->period + 1;
- pt->pending_intr_nr += missed_ticks;
- pt->scheduled += missed_ticks * pt->period;
- }
+ missed_ticks = missed_ticks / (s_time_t) pt->period + 1;
+ pt->pending_intr_nr += missed_ticks;
+ pt->scheduled += missed_ticks * pt->period;
}
static void pt_freeze_time(struct vcpu *v)
pt_lock(pt);
- if ( mode_is(pt->vcpu->domain, no_missed_tick_accounting) )
- pt->pending_intr_nr = 1;
- else
- pt->pending_intr_nr++;
+ pt->pending_intr_nr++;
if ( !pt->one_shot )
{
}
else
{
- pt->pending_intr_nr--;
if ( mode_is(v->domain, no_missed_tick_accounting) )
+ {
pt->last_plt_gtime = hvm_get_guest_time(v);
+ pt->pending_intr_nr = 0; /* 'collapse' all missed ticks */
+ }
else
+ {
pt->last_plt_gtime += pt->period_cycles;
+ pt->pending_intr_nr--;
+ }
}
if ( mode_is(v->domain, delay_for_missed_ticks) &&